/*
 moxl - Modular XML Library
 Copyright (c) 2007, Malcolm Sparks

 This program is free software; you can redistribute it and/or
 modify it under the terms of the GNU General Public License
 as published by the Free Software Foundation; either version 2
 of the License, or (at your option) any later version.

 This program is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 GNU General Public License for more details.

 You should have received a copy of the GNU General Public License
 along with this program; if not, write to the Free Software
 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 */
package moxl.tokenizer.xml.cdata;

import java.io.IOException;

import moxl.reader.LocateableReader;
import moxl.tokenizer.EndOfFileState;
import moxl.tokenizer.Token;
import moxl.tokenizer.AbstractTokenizerState;
import moxl.tokenizer.TokenizerStateMachine;
import moxl.tokenizer.xml.XmlTokenType;

public class ContentCharacterDataStartState extends AbstractTokenizerState
{

	private static AbstractTokenizerState instance = new ContentCharacterDataStartState();

	public static AbstractTokenizerState getInstance()
	{
		return instance;
	}

	@Override
	public boolean isStartState()
	{
		return true;
	}

	@Override
	public void accept(TokenizerStateMachine stateMachine, Token token, LocateableReader reader) throws IOException
	{
		reader.mark(1);
		int c = reader.read();
		if (c == -1)
		{
			stateMachine.changeState(EndOfFileState.getInstance());

		}
		// else if (c == '<' || c == '&')
		else if (c == '<')
		{
			throw new IllegalStateException("Internal error: Should not be in this state if next char is " + (char) c + ", location is " + token.getLocation());

		}
		else
		{
			token.append(c);
			token.setTokenType(XmlTokenType.CHARACTER_DATA);
			stateMachine.changeState(ContentCharacterDataContinueState.getInstance());

		}

	}

}
